package com.example.demo;

import org.springframework.cglib.proxy.Enhancer;

import java.lang.reflect.Proxy;

/**
 * <p>Title: 创建数据库代理对象-工厂类</p>
 * <p>Description: 对数据库对象在内存中动态构建一个子类对象</p>
 * <p>Copyright: Copyright (c) 2016</p>
 * <p>Company: Sunshine Insurance Group Co., Ltd.</p>
 * @author xiepan
 * @version 1.0
 * 修改记录：
 * 修改序号，修改日期，修改人，修改内容
 */
public class CjlibProxyFactory {

    /**
     * <li>创建人：xiepan </li>
     * <li>创建时间：2019年8月9日</li>
     * <li>创建目的：【使用cglib创建子类对象】</li>
     * <li>修改目的：【修改人：修改目的，修改时间】</li>
     * @param clazz 目标类class
     * @return  返回目标子类对象
     */
    public static final <T> T getProxy(Class<T> clazz){
        //1.工具类
        Enhancer en = new Enhancer();
        //2.设置父类
        en.setSuperclass(clazz);
        //3.设置回调函数
        en.setCallback(new ProxyInterceptor(null));
        //4.创建子类(代理对象)
        return (T) en.create();
    }
    
    /**
     * <li>创建人：xiepan </li>
     * <li>创建时间：2019年8月9日</li>
     * <li>创建目的：【使用cglib创建代理对象】</li>
     * <li>修改目的：【修改人：修改目的，修改时间】</li>
     * @param t 被代理的目标对象
     * @return  返回子类代理对象
     */
    public static final <T> T getProxy(T t){
        if(t == null) {
            return null;
        }else if(t.getClass().toString().indexOf(Enhancer.class.getSimpleName()) != -1) {
            return t;
        }
        //1.工具类
        Enhancer en = new Enhancer();
        //2.设置父类
        en.setSuperclass(t.getClass());
        //3.设置回调函数
        en.setCallback(new ProxyInterceptor(t));
        //4.创建子类(代理对象)
        return (T) en.create();
    }

}